#include "XMLUtils.h"

// 添加一个XML节点
void create_xml_doc(XMLDocument& doc, int id, const char* link, const char* title, const char* content){
    // 1. 创建 <doc> 节点
    XMLElement* docNode = doc.NewElement("doc");
    doc.RootElement()->InsertEndChild(docNode); // 将其添加到根节点下
    
    // 2. 创建 <id> 节点并设置文本
    XMLElement* idNode = doc.NewElement("id");
    idNode->SetText(id); // TinyXML-2 自动将 int 转换为文本
    docNode->InsertEndChild(idNode);

    // 3. 创建 <link> 节点并设置文本
    XMLElement* linkNode = doc.NewElement("link");
    linkNode->SetText(link);
    docNode->InsertEndChild(linkNode);

    // 4. 创建 <title> 节点并设置文本
    XMLElement* titleNode = doc.NewElement("title");
    titleNode->SetText(title);
    docNode->InsertEndChild(titleNode);

    // 5. 创建 <content> 节点并设置文本
    XMLElement* contentNode = doc.NewElement("content");
    contentNode->SetText(content);
    docNode->InsertEndChild(contentNode);
}

// 读取指定路径的xml文件, 将内容写入到vector<Document>中
void add_document_by_xml(const string& dir, vector<PageProcessor::Document>& document){
    XMLDocument doc;
    string filename = dir;
    
    // 1. 加载文件并检查错误
    if (doc.LoadFile(filename.c_str()) != XML_SUCCESS) {
        cout << "Error loading XML file: " << filename << endl;
        return;
    }

    // 2. 定位到 <channel> 节点
    XMLElement* rssNode = doc.RootElement(); // <rss> 节点
    if (!rssNode || strcmp(rssNode->Name(), "rss") != 0) {
        cout << "Error: Root <rss> element not found." << endl;
        return;
    }
    
    XMLElement* channelNode = rssNode->FirstChildElement("channel"); // <channel> 节点
    if (!channelNode) {
        cout << "Error: <channel> element not found." << endl;
        return;
    }

    // 3. 开始遍历第一个 <item> 节点
    // 从 <channel> 的第一个 <item> 子节点开始
    XMLElement *itemNode = channelNode->FirstChildElement("item");

    while (itemNode){
        // 提取 <item> 内的具体字段
        // 提取 <title>
        XMLElement *titleNode = itemNode->FirstChildElement("title");
        const char *titleText = titleNode ? titleNode->GetText() : "N/A";

        // 提取 <link>
        XMLElement *linkNode = itemNode->FirstChildElement("link");
        const char *linkText = linkNode ? linkNode->GetText() : "N/A";

        // 提取 <content>
        const char *contText;
        XMLElement *contNode = itemNode->FirstChildElement("content");
        if(contNode){
            // <content>标签存在
            contText = contNode ? contNode->GetText() : "N/A";
        }else{
            // 注意：<description> 的内容是 CDATA 包裹的 HTML 片段，
            // 提取方法一样，但后续处理可能需要去除 HTML 标签。
            XMLElement *descNode = itemNode->FirstChildElement("description");
            contText = descNode ? descNode->GetText() : "N/A";

            if(contNode == nullptr && descNode == nullptr){
                continue;
            }
        }


        if(strcmp(contText, "N/A") == 0){
            // item信息有误, 不记录
            continue;
        }

        int id = document.size() + 1;
        document.push_back({ id, linkText, titleText, contText });

        // 指向下一个item节点
        itemNode = itemNode->NextSiblingElement("item");
    }
}